#include "handler.h"
#include <Windows.h>

HINSTANCE INST; // 程序实例句柄

// 声明窗口过程函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

// 应用程序入口点
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
  INST = hInstance; // 保存程序实例句柄

  // 定义窗口类名
  const TCHAR CLASS_NAME[]{L"Sample Window Class"};

  // 填充 WNDCLASSEX 结构
  WNDCLASSEX wc{0};
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = CS_VREDRAW | CS_HREDRAW;
  wc.lpfnWndProc = WindowProc;                   // 窗口过程函数指针
  wc.hInstance = hInstance;                      // 当前程序实例句柄
  wc.lpszClassName = CLASS_NAME;                 // 窗口类名
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);      // 使用默认箭头光标
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 默认窗口背景色

  // 注册窗口类
  RegisterClassEx(&wc);

  // 创建窗口
  HWND hwnd =
      CreateWindowEx(0,                   // 扩展窗口样式
                     CLASS_NAME,          // 窗口类名
                     L"简单窗口",         // 窗口标题
                     WS_OVERLAPPEDWINDOW, // 窗口样式
                     // 位置和大小
                     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                     NULL,      // 父窗口
                     NULL,      // 菜单
                     hInstance, // 程序实例句柄
                     NULL       // 附加数据
      );

  if (hwnd == NULL) {
    return 0;
  }

  // 显示窗口
  ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);

  // 消息循环
  MSG msg = {0};
  while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }

  return msg.wParam;
}

// 窗口过程函数，处理发送到窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                            LPARAM lParam) {
  MsgInfo info{hwnd, uMsg, wParam, lParam};
  switch (uMsg) {
  case WM_CREATE:
    return handler::wm_create(info);
  case WM_COMMAND:
    return handler::wm_command(info);
  case WM_PAINT:
    return handler::wm_paint(info);
  case WM_DESTROY:
    PostQuitMessage(0); // 当窗口被销毁时，退出消息循环
    return 0;
  }
  // 对于我们不处理的消息，返回默认处理
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
